package com.demo.common;

import java.util.Locale;
import java.util.Random;

/**
 * 工具类
 * @author ryuu.kk
 *
 */
public final class Utils {

	/**
	 * 构造函数
	 */
	private Utils() {
		//do something
	}
	
	/**
	 * 返回唯一标示符<br>
	 * 由于该方法生成的UUID散布大,且无序,则不适作为DB的主键
	 * @return 唯一标示符
	 */
	//@Deprecated
	//public final static String uuid() {
	//	return UUID.randomUUID().toString().replaceAll("-", "");
	//}
	
	/**
	 * 返回唯一标示符<br>
	 * 该方法返回的UUID散布大,但有序,可作为DB的主键使用
	 * 
	 * @return 唯一标示符(32位长度)
	 */
	public final static String uuid() {
		UUIDGenerator uuid = new UUIDGenerator();
		return uuid.generate();
	}
	
	/**
	 * 返回唯一标示符<br>
	 * 该方法返回的UUID散布大,但有序,可作为DB的主键使用
	 * 注意:该方法参数作为UUID的前缀(16进制形式)
	 * @param prefix UUID前缀
	 * @return 唯一标示符(32位长度)
	 */
	public final static String uuid(int prefix) {
		UUIDGenerator uuidGen = new UUIDGenerator();
		String uuid = uuidGen.generate();
		if (prefix > 0) {
			String s = Integer.toHexString(prefix);
			uuid = s + uuid.substring(s.length());
		}
		return uuid;
	}
	
	/**
	 * 返回唯一标识符<br>
	 * 该方法返回UUID为8位Long型变量,
	 * 适合作为代理主键生成,作为替换DB的自增主键或sequence
	 * 在小型分布系统中（百万数据）可以认为是唯一的
	 * @return 唯一标识符(8位)
	 */
	public final static long uuidShort() {
		UUIDGenerator uuid = new UUIDGenerator();
		return uuid.generateShort();
	}
	
	
	/**
	 * 返回唯一标识符<br>
	 * 该方法返回UUID为17位Long型变量,
	 * 适合作为代理主键生成,作为替换DB的自增主键或sequence
	 * 在中小型分布系统中可以认为是唯一的
	 * @return 唯一标识符(17位)
	 */
	public final static long uuidNormal() {
		UUIDGenerator uuid = new UUIDGenerator();
		return uuid.generateLong();
	}
	
	/**
	 * 返回min~max的随机数
	 * @param min 最小值
	 * @param max 最大值
	 * @return int 随机数
	 */
	public final static int random(int min, int max) {
		if (min < 0) {
			min = 0;
		}
		if (max < 0) {
			max = 0;
		}
        Random random = new Random();  
        int s = random.nextInt(max)%( max - min + 1) + min;  
        return s;  
	}
	
	/**
	 * 返回随机数
	 * @return int 随机数 1 ~ 2<sup>31</sup>-1
	 */
	public final static int random() {
		return random(1, Integer.MAX_VALUE);
	}
	
	/**
	 * 将字节码转换为字符串
	 * @param bytes byte[]
	 * @return String 字符串
	 */
	public final static String toString(byte[] bytes) {
		
		String content = "";
		if (bytes != null) {
			content = new String(bytes);
		}
		// 将html内容转义
		return content;
	}
	
	/**
	 * 将字符串解析成Locale对象
	 * @see {@link com.opensymphony.xwork2.util.LocalizedTextUtil}
	 * 
	 * @param localeStr 	字符串
	 * @param defaultLocale 默认的locale
	 * @return 将字符串解析为Locale对象
	 */
	public static Locale localeFromString(String localeStr, Locale defaultLocale) {
		if ((localeStr == null) || (localeStr.trim().length() == 0) || ("_".equals(localeStr))) {
			if (defaultLocale != null) {
				return defaultLocale;
			}
			return Locale.getDefault();
		}
		int index = localeStr.indexOf('_');
		//zh
		if (index < 0) {
			return new Locale(localeStr);
		}
		String language = localeStr.substring(0, index); 
		//zh_
		if (index == localeStr.length() - 1) {
			return new Locale(language);
		}
		//zh_CN
		localeStr = localeStr.substring(index + 1);
		index = localeStr.indexOf('_');
		if (index < 0) {
			return new Locale(language, localeStr);
		}
		//zh_CN_
		String country = localeStr.substring(0, index);
		if (index == localeStr.length() - 1) {
			return new Locale(language, country);
		}
		//th_TH_TH
		localeStr = localeStr.substring(index + 1);
		return new Locale(language, country, localeStr);
	}
	/**
	 * 对构造locale的测试
	 * @param args 参数
	 */
	public static void main(String[] args) {
		Locale[] localesArray = Locale.getAvailableLocales();
    	for (Locale l : localesArray) {
    		localeFromString(l.toString(), null);
    		//System.err.println(l.toString());
    	}
    	String[] array = {"_CN", "zh_CN", "zh_", "th_TH_TH", "th_TH_", "th__TH", "_TH_TH", "__TH"};
    	
    	for (String s : array) {
    		System.err.println(localeFromString(s, null).toString());
    	}
    	
    	Long time = System.currentTimeMillis();
		for (int i = 0 ; i < 100; i ++) {
			String uuids = Utils.uuid(1);
			System.out.println(uuids);
			System.out.println(Long.parseLong(uuids.substring(16,32), 16));
		}
		System.out.println(System.currentTimeMillis() - time);
	}
}


